package main

import "fmt"

// 稀疏数组
func main() {

	// 1 先创建原始数据
	var chessMap [11][11]int
	chessMap[2][2] = 1 // 黑子
	chessMap[5][3] = 2 //篮子
	// 2 输出原始数组
	for _, v := range chessMap {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}
	// 转为稀疏数组
	// 遍历chessMap 发现不少0的，保存到结构体
	var sparseArray []ValNode
	// 标准的稀释数组还有一个记录原始二位数组的行和列
	valNode := ValNode{
		row: 11,
		col: 11,
		val: 0,
	}
	sparseArray = append(sparseArray, valNode)
	for i, v := range chessMap {
		for j, v2 := range v {
			if v2 != 0 {
				valNode := ValNode{
					row: i,
					col: j,
					val: v2,
				}
				sparseArray = append(sparseArray, valNode)
			}
		}
	}

	// 输出稀疏数组
	for i, node := range sparseArray {
		fmt.Printf("%d: %d %d %d \n", i, node.row, node.col, node.val)
	}
	// 存盘

	// 恢复
	var chessMap2 [11][11]int
	for i, node := range sparseArray {
		if i == 0 {
			// 第一行记录的是原始大小，跳过
			continue
		}
		chessMap2[node.row][node.col] = node.val
	}
	fmt.Println("====恢复后的数据====")
	for _, v := range chessMap2 {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}

}

type ValNode struct {
	row int
	col int
	val int
}
